/**
 * @file save_img.cc
 * @author your name (you@domain.com)
 * @brief 图像保存线程相关事务
 * @version 0.1
 * @date 2022-10-27
 * 
 * @copyright Copyright (c) 2022
 * 
 */
#include "imageProcess.h"
#include <semaphore.h> 
/* 
作用： 每次疲劳\分心行为开始或者持续，便在文件夹里每隔2s保存一帧图像  文件夹名： imgDir
重点：1、3号线程通过信号量和队列进行通讯：数据包括：持续时间、和Mat格式数据  
*/

sem_t binSem_save;         //定义一个全局二进制信号量，用于1号和3号线程同步
mutex mtxQueueSaveimg_368; 
queue<pair<string, Mat>> queueSaveimg_368;

/*-------------------------------------------
                线程1:图像保存
-------------------------------------------*/
int save_img(int cpu_id)
{
    cpu_set_t mask;
    CPU_ZERO(&mask);
    CPU_SET(cpu_id, &mask);
    if (pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask) < 0)
    {
        cerr << "set thread affinity failed" << endl;
        return -1;
    }
    printf("Bind save_img thread to CPU %d\n", cpu_id);

    while(1)
    {
         //信号量不从3号线程发来，就阻塞，不占用cpu资源
        sem_wait(&binSem_save);
        //等待那边信号量一发送，这边就存帧， 帧的名字是行为类别 + 开始时间 + 持续时间，如sleepy_11_2.jpg
        mtxQueueSaveimg_368.lock();
        pair<string, Mat> img_info = queueSaveimg_368.front();
        queueSaveimg_368.pop();
        mtxQueueSaveimg_368.unlock();
        string save_jpg_name = "imgDir/" + img_info.first + ".jpg";
        Mat img = img_info.second;

        //保存图片
        cv::imwrite(save_jpg_name, img);
        cout << "一号线程save "<< save_jpg_name << " done!" <<endl;
    }
    return 0;
}


